/**
 * Copyright (c) 2018, Alex. All rights reserved.
 */
package com.oschina.bottle.common.enums;

import java.util.ArrayList;
import java.util.List;

/**
 * 提供操作CodeEnum枚举类的一系列方法
 *
 * @author <a href="mailto:zhongchao@gegejia.com">zhong</a>
 * @version 1.0 2018/1/4
 * @since 1.0
 */
public class EnumUtils {

    public static <E extends Enum<E> & CodeEnum<T>, T> E getEnumByCode(T code, Class<E> enumClazz) {
        if (code == null) {
            throw new IllegalArgumentException("this code must not be null");
        }

        for (E e : enumClazz.getEnumConstants()) {
            if (e.getCode().equals(code)) {
                return e;
            }
        }

        return null;
    }

    public static <E extends Enum<E>> E getEnumByName(String enumName, Class<E> enumClazz) {
        if (enumName == null) {
            throw new IllegalArgumentException("this enumName must not be null");
        }

        return Enum.valueOf(enumClazz, enumName);
    }

    public static <E extends Enum<E> & CodeEnum<T>, T> List<T> getCodeList(Class<E> enumClazz) {
        List<T> codes = new ArrayList<>();
        for (E e : enumClazz.getEnumConstants()) {
            codes.add(e.getCode());
        }
        return codes;
    }
}
